home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-07-03 | 7.6 KB | 234 lines | [TEXT/R*ch] |
-
- open List;
- open Fnlib Mixture Const Prim Smlprim Globals Location;
- open Units Types Asynt;
-
- fun errorOverloadingType loc id tau =
- (
- msgIBlock 0;
- errLocation loc;
- errPrompt "Overloaded "; msgString id;
- msgString " cannot be applied to argument(s) of type ";
- printType tau; msgEOL();
- msgEBlock();
- raise Toplevel
- );
-
- val negInt = mkPrimInfo 1 (MLPprim(1, Psmlnegint))
- and absInt = mkPrimInfo 1 (MLPccall(1, "sml_abs_int"))
- and makestringInt = mkPrimInfo 1 (MLPccall(1, "sml_string_of_int"))
- and addInt = mkPrimInfo 1 MLPadd_int
- and subInt = mkPrimInfo 1 MLPsub_int
- and mulInt = mkPrimInfo 1 MLPmul_int
- and ltInt = mkPrimInfo 1 MLPlt_int
- and gtInt = mkPrimInfo 1 MLPgt_int
- and leInt = mkPrimInfo 1 MLPle_int
- and geInt = mkPrimInfo 1 MLPge_int
- ;
-
- fun resolveIntOvlId loc "~" OVL1NNo = negInt
- | resolveIntOvlId loc "abs" OVL1NNo = absInt
- | resolveIntOvlId loc "makestring" OVL1NSo = makestringInt
- | resolveIntOvlId loc "+" OVL2NNNo = addInt
- | resolveIntOvlId loc "-" OVL2NNNo = subInt
- | resolveIntOvlId loc "*" OVL2NNNo = mulInt
- | resolveIntOvlId loc "<" OVL2NNBo = ltInt
- | resolveIntOvlId loc ">" OVL2NNBo = gtInt
- | resolveIntOvlId loc "<=" OVL2NNBo = leInt
- | resolveIntOvlId loc ">=" OVL2NNBo = geInt
- | resolveIntOvlId loc _ _ = fatalError "resolveIntOvlId"
- ;
-
- val makestringChar = mkPrimInfo 1 (MLPccall(1, "sml_makestring_of_char"));
-
- fun resolveCharOvlId loc "makestring" OVL1NSo = makestringChar
- | resolveCharOvlId loc "<" OVL2NNBo = ltInt
- | resolveCharOvlId loc ">" OVL2NNBo = gtInt
- | resolveCharOvlId loc "<=" OVL2NNBo = leInt
- | resolveCharOvlId loc ">=" OVL2NNBo = geInt
- | resolveCharOvlId loc id _ =
- errorOverloadingType loc id type_char
- ;
-
- val negReal = mkPrimInfo 1 (MLPprim(1, Pfloatprim Psmlnegfloat))
- and absReal = mkPrimInfo 1 (MLPccall(1, "sml_abs_real"))
- and makestringReal = mkPrimInfo 1 (MLPccall(1, "sml_string_of_float"))
- and addReal = mkPrimInfo 1 MLPadd_real
- and subReal = mkPrimInfo 1 MLPsub_real
- and mulReal = mkPrimInfo 1 MLPmul_real
- and ltReal = mkPrimInfo 1 MLPlt_real
- and gtReal = mkPrimInfo 1 MLPgt_real
- and leReal = mkPrimInfo 1 MLPle_real
- and geReal = mkPrimInfo 1 MLPge_real
- ;
-
- fun resolveRealOvlId loc "~" OVL1NNo = negReal
- | resolveRealOvlId loc "abs" OVL1NNo = absReal
- | resolveRealOvlId loc "makestring" OVL1NSo = makestringReal
- | resolveRealOvlId loc "+" OVL2NNNo = addReal
- | resolveRealOvlId loc "-" OVL2NNNo = subReal
- | resolveRealOvlId loc "*" OVL2NNNo = mulReal
- | resolveRealOvlId loc "<" OVL2NNBo = ltReal
- | resolveRealOvlId loc ">" OVL2NNBo = gtReal
- | resolveRealOvlId loc "<=" OVL2NNBo = leReal
- | resolveRealOvlId loc ">=" OVL2NNBo = geReal
- | resolveRealOvlId loc _ _ = fatalError "resolveRealOvlId"
- ;
-
- val makestringString = mkPrimInfo 1 (MLPccall(1, "sml_makestring_of_string"))
- and ltString = mkPrimInfo 1 MLPlt_string
- and gtString = mkPrimInfo 1 MLPgt_string
- and leString = mkPrimInfo 1 MLPle_string
- and geString = mkPrimInfo 1 MLPge_string
- ;
-
- fun resolveStringOvlId loc "makestring" OVL1NSo = makestringString
- | resolveStringOvlId loc "<" OVL2NNBo = ltString
- | resolveStringOvlId loc ">" OVL2NNBo = gtString
- | resolveStringOvlId loc "<=" OVL2NNBo = leString
- | resolveStringOvlId loc ">=" OVL2NNBo = geString
- | resolveStringOvlId loc id _ =
- errorOverloadingType loc id type_string
- ;
-
- fun resolveOvlId loc id ovltype tau =
- case (id, ovltype) of
- ("print", OVL1TXXo) =>
- let val sc = freshSchemeOfType tau in
- mkPrimInfo 1 (MLPgvt({qual="Meta", id="print"}, ref (Obj.repr sc)))
- end
- | ("installPP", OVL1TPUo) =>
- let val sc = freshSchemeOfType tau in
- mkPrimInfo 1 (MLPgvt({qual="Meta", id="installPP"}, ref (Obj.repr sc)))
- end
- | (_,_) =>
- (case tyNameOfType tau of
- SOME tyname =>
- if (isEqTN tyname tyname_int) then
- resolveIntOvlId loc id ovltype
- else if (isEqTN tyname tyname_char) then
- resolveCharOvlId loc id ovltype
- else if (isEqTN tyname tyname_real) then
- resolveRealOvlId loc id ovltype
- else if (isEqTN tyname tyname_string) then
- resolveStringOvlId loc id ovltype
- else
- errorOverloadingType loc id tau
- | NONE =>
- errorMsg loc
- ("Unable to resolve overloaded identifier: " ^ id))
- ;
-
- fun resolve3Dot (loc: Location) fs rho =
- let val (fields, unresolved) = contentsOfRowType rho
- val () =
- if unresolved then
- errorMsg loc "Unresolved record pattern"
- else ();
- val fs' = map (fn (lab,_) => (lab, (loc, WILDCARDpat))) fields
- in fs @ fs' end
- ;
-
- fun resolveOvlPat (loc, pat') =
- case pat' of
- SCONpat _ => ()
- | VARpat _ => ()
- | WILDCARDpat => ()
- | NILpat _ => ()
- | CONSpat(_, p) => resolveOvlPat p
- | EXNILpat _ => ()
- | EXCONSpat(_, p) => resolveOvlPat p
- | EXNAMEpat _ => fatalError "resolveOvlPat"
- | REFpat p => resolveOvlPat p
- | RECpat rp =>
- (case !rp of
- RECrp(fs, NONE) =>
- (app_field resolveOvlPat fs;
- rp := TUPLErp(map snd (sortRow fs)))
- | RECrp(fs, SOME rho) =>
- (app_field resolveOvlPat fs;
- rp := TUPLErp(map snd (sortRow (resolve3Dot loc fs rho))))
- | TUPLErp _ => fatalError "resolveOvlPat")
- | VECpat ps => app resolveOvlPat ps
- | PARpat p => resolveOvlPat p
- | INFIXpat _ => fatalError "resolveOvlPat"
- | TYPEDpat(p,t) =>
- resolveOvlPat p
- | LAYEREDpat(p1, p2) =>
- (resolveOvlPat p1; resolveOvlPat p2)
- ;
-
- fun resolveOvlExp (loc, exp') =
- case exp' of
- SCONexp _ => ()
- | VARexp(ref (RESve _)) => ()
- | VARexp(ve as ref (OVLve (ii, ovltype, tau))) =>
- let val {qualid, info} = ii
- val {qual, id} = qualid
- val pi = resolveOvlId loc id ovltype tau
- in
- #idKind info :=
- { qualid={qual="General", id=id}, info=PRIMik pi };
- ve := RESve ii
- end
- | FNexp mrules =>
- app resolveOvlMRule mrules
- | APPexp(e1, e2) =>
- (resolveOvlExp e1; resolveOvlExp e2)
- | LETexp(dec, body) =>
- (resolveOvlDec dec; resolveOvlExp body)
- | RECexp(r as ref (RECre fs)) =>
- (app_field resolveOvlExp fs;
- if isTupleRow fs then
- r := TUPLEre(map snd fs)
- else ())
- | RECexp(ref (TUPLEre _)) => fatalError "resolveOvlExp"
- | VECexp es =>
- app resolveOvlExp es
- | PARexp e =>
- resolveOvlExp e
- | INFIXexp es => fatalError "resolveOvlExp"
- | TYPEDexp(e,ty) =>
- resolveOvlExp e
- | ANDALSOexp(e1, e2) =>
- (resolveOvlExp e1; resolveOvlExp e2)
- | ORELSEexp(e1, e2) =>
- (resolveOvlExp e1; resolveOvlExp e2)
- | HANDLEexp(e, mrules) =>
- (resolveOvlExp e; app resolveOvlMRule mrules)
- | RAISEexp e =>
- resolveOvlExp e
- | IFexp(e0, e1, e2) =>
- (resolveOvlExp e0; resolveOvlExp e1; resolveOvlExp e2)
- | WHILEexp(e1, e2) =>
- (resolveOvlExp e1; resolveOvlExp e2)
- | SEQexp(e1, e2) =>
- (resolveOvlExp e1; resolveOvlExp e2)
-
- and resolveOvlMRule (MRule(pats, exp)) =
- (app resolveOvlPat pats; resolveOvlExp exp)
-
- and resolveOvlDec (_, dec') =
- case dec' of
- VALdec (pvbs, rvbs) =>
- (app resolveOvlValBind pvbs; app resolveOvlValBind rvbs)
- | PRIM_VALdec _ => ()
- | FUNdec _ => fatalError "resolveOvlDec"
- | TYPEdec _ => ()
- | PRIM_TYPEdec _ => ()
- | DATATYPEdec _ => ()
- | ABSTYPEdec(_, _, dec2) =>
- resolveOvlDec dec2
- | EXCEPTIONdec _ => ()
- | LOCALdec(dec1, dec2) =>
- (resolveOvlDec dec1; resolveOvlDec dec2)
- | OPENdec _ => ()
- | EMPTYdec => ()
- | SEQdec(dec1, dec2) =>
- (resolveOvlDec dec1; resolveOvlDec dec2)
- | FIXITYdec _ => ()
-
- and resolveOvlValBind (ValBind(pat, exp)) =
- (resolveOvlPat pat; resolveOvlExp exp)
- ;
-